package com.example.design_pattern.strategy;


import com.example.design_pattern.strategy.fly.IBehaviorFly;
import com.example.design_pattern.strategy.quack.IBehaviorQuack;

/**
 * Created by SQ_BXZ on 2019-02-15.
 *  鸭子超类
 */

public abstract class Duck {
    // 为行为接口类型声明两个引用变量，所有子类都继承他们（同一个包的子类）
    // 多用组合少用继承，组合的弹性更大
    IBehaviorFly flyBehavior;
    IBehaviorQuack quackBehavior;

    // 可以在子类中设置鸭子的行为，而不是通过子类的构造器实例化
    public void setFlyBehavior(IBehaviorFly flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(IBehaviorQuack quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    public void performQuack(){
        quackBehavior.quack();
    }

    public void performFly(){
        // 超类Duck 不亲自处理 飞行行为，而是委托给 flyBehavior 引用的对象
        flyBehavior.fly();
    }

    public abstract void display();

    public void swim(){
        System.out.println("All ducks float, even decoys!");
    }



}
